package com.updateeproject.error;
/**
 * 枚举就是让某个类型的变量的取值只能为若干个固定值中的一个，否则编译器就会报错
 * 列举出来，选择其中一个
 */
//枚举实质上还是类，而每个被枚举的成员实质上就是一个枚举类型的实例，
// 他们默认都是 public static final 修饰的。*******怪不得是通过类名进行调用
// 可以直接通过枚举类型名使用它们
//如果需要定义一组常量的时候，可以使用枚举类型
//通过 枚举类名称.常量

/**
 * ==========枚举实现接口commonError方法===========
 * 枚举本质上就是一个面向对象的类
 * <p>
 * <p>
 * 通过异常的形式用这些错误，只要程序出了异常，这个异常会被最后controller层SpringBoot的handler捕获并处理
 * 所以在error包里面创建一个BusinessException类
 */
public enum EmBusinessError implements CommonError {
    /**
     * 在json序列化的时候，转成字符串，会把0开头的转化为个位？？
     */
    //未知错误
    UNKNOWN_ERROR(10002, "未知错误"),
    //我们会定义通用的是错误类型00001开头
    PARAMETER_VALIDATION_ERROR(10001, "参数不合法"),
    //这里是要输入  逗号
    //这里的errMsg是需要不断变化的，所以需要一个接口去改动对应的errMsg

    //20000开头为用户信息相关错误定义
    /**
     * 在做企业级分布式开发的时候，全局需要有统一的一个状态码的流转，也就是说，不同模块之间的信息要进行互通，
     * **********就比如错误信息要标识一个全局的错误码，系统越多，就应该在一个 通用的文件 里对 错误码 进行管理
     */
    // 标识全局错误码，在通用的文件里对错误码做一个管理
    USER_NOT_EXIST(20001, "用户不存在"),
    I_LOVE_U(520, "LOVE");
    //如果想要往对应的错误信息里加不同的说明，在这里无限延伸地TA想要的错误信息的一个enum值就可以了
    //⬆⬆⬆⬆⬆⬆还需要构造函数？这构造函数该怎么用呢 3-3 5'12''
    //USER_NOT_EXIST被定义出来以后，可以直接通过构造方法，构造出来一个实现了CommonError接口的Enum的子类对象
    //5'21'' USER_NOT_EXIST被定义出来以后，可以直接通过构造方法，构造出来一个实现了CommonError接口的子类，子类是个Enum类型


    /**
     * 然后去实现 实现类里面的接口里的默认方法
     */


    private int errCode;
    private String errMsg;


    private EmBusinessError(int errCode, String errMsg) {
        this.errCode = errCode;
        this.errMsg = errMsg;
    }

    /***
     *这些方法，都是枚举类对象/原接口对象（其实是枚举类对象向上转型）/异常类对象调用
     *
     */
    @Override
    public int getErrCode() {
        return this.errCode;
    }


    @Override
    public String getErrMsg() {
        return this.errMsg;
    }


//===============================================================

//  这个方法是用来干嘛的呢，为什么要返回一个接口类型呢？？

    /**
     * 6'25''
     * 举个例子，我们会定义一个通用的错误类型，
     * 我们会定义通用的是错误类型00001开头
     * PARAMETER_VALIDATION_ERROR(00001,"参数不合法")
     * 这个方法要解决什么问题,我们有很多的程序会存在有入参校验，有了通用的错误码，我们可以不必再去定义无数的错误码
     * 可以使用通用的错误码00001，但是对应errMsg的描述是要，今天这个场景下面00001对应的一个参数的String是“用户名没传”
     * 明天可能邮箱不对，
     * 所以需要一个接口（实现接口里的方法）去改动对应 错误（对象）的errMsg
     * 这里的errMsg是需要不断变化的，
     * todo:想想是在哪用来着？
     *
     * @param errMsg
     * @return
     */
//  那个BusinessException接收EmBusinessError的传参,用于构造业务异常
    @Override
    /**
     public EmBusinessError setErrMsg(String errMsg){
     this.errMsg=errMsg;
     return this;//枚举对象调用这方法，设置属性后把“重生的自己返回给自己” 不过要作为以多态的方式返回
     ？？？？那接口与其实现类也能玩多态吗？  能。。。
     }*/

    //*************************   一般的Setter方法是没有返回值的，这个有！！！！！
    public CommonError setErrMsg(String errMsg) {  //等枚举对象调用这个setErrMsg(String errMsg)方法时，会返回
        this.errMsg = errMsg;
        /**通过定制化的方式去改动它，并且return自己，
         有了这个东西，我们以后自己要往对应的错误信息里面填值，只要
         那该怎么用它呢，我们这边定义一种流程控制的机制，就是通过Exception的方式，只要程序出了异常，统一抛一个Exception
         ,这个Exception会被最后controller层SpringBoot的handler捕获并处理
         *所以在error包里面创建一个BusinessException类
         */
        //这个errMsg是赋值给了EmBusinessError的成员变量
        // TODO: 2019/6/10 为什么要返回自己呢？？
        return this;//return自己是什么意思？？？莫名其妙来一个Common，多态思想
        // ********************** return this就是返回当前对象的引用(就是实际调用这个方法的实例化对象)
    }
}
//CommonError和EmBusinessError的关系 继承和实现类是继承的子类吗？
